package day08;

public class MultiTypeDemo {//mʌlti多种
    public static void main(String[] args) {
        /**超类型的引用指向派生类的对象*/
        //向上造型,只有小到大是自动类型转换,其它情况都强转。
        Aoo o = new Boo();
        //没强转之前编译错误，
        // o是Aoo类型(超类)，o1是Boo类型(派生类)，大转小，必须强转(Boo)o，
        // 把o强转为Boo类型。编译期只检查语法。运行期分配对象。
        // 引用类型变量o指向的对象就是Boo类型，
        // 所以o强转为Boo类型好使(匹配),满足条件一(引用所指向的对象，就是该类型)。
        Boo o1 = (Boo) o;
        Coo oc = new Coo();
        //o指向的是Boo类型,满足条件二:
        // 引用所指向的对象Boo实现了该Inter接口或继承了该类。
        // o是Aoo类型，o2是Inter类型，它两没有大小关系。
        // 只要不是前大后小，就一定强转。看o所指向的对象
        //引用所指向的对象是Boo，Boo实现了该Inter接口或继承了该类。
        // 符合条件二(看的是对象，对象实现了Inter接口就可以)
        Inter o2 = (Inter) o;


        /**报错：java.lang.ClassCastException类型转换异常*/
        //报错,因为引用变量o所指向的对象是Boo，
        // Boo不是Coo类型,Boo没有实现Coo接口也没有继承Coo类,条件一和条件二都不符合
        //Coo o3 = (Coo) o;

        //判断o是否是Coo类型
        if (o instanceof Coo){
            //Coo类继承了Aoo类
            Coo o4 = (Coo) o;
        }else {
            System.out.println("o不是Coo类型");
            //把o强转为Coo，o指向的对象不是Coo类型，不符合第一条件。
            // Boo没有实现Coo接口，Boo也没有继承Coo类，不符合第二条件。
            // 则发生ClassCastException类型转换异常
        }
        System.out.println(o instanceof Boo);//true,o指向的对象是Boo类型,满足第一条件
        System.out.println(o instanceof Inter);//true,o指向的对象Boo实现了Inter接口,满足第二条件
        System.out.println(o instanceof Coo);//false,因为o指向的对象Boo既不是Coo类型也没有继承或实现该类。
        /**必须判断完之后再做强转*/
        //判断o是否是Coo类型。它为true的条件跟强转成功的条件是匹配的。
        // false就表示强转不成功类型不匹配,不走里面就不报异常。
        if (o instanceof Coo){
            Coo o3 = (Coo) o;
            System.out.println("o是Coo类型");
        }else {
            System.out.println("o不是Coo类型");//o不是Coo类型
        }
        if (o instanceof Boo){
            Boo o5 = (Boo) o;
            System.out.println("o是Boo类型");//o是Boo类型
        }else {
            System.out.println("o不是Boo类型");
        }
    }
}
class Aoo{}
class Boo extends Aoo implements Inter{}
interface Inter{}
class Coo extends Aoo{}//引用所指向的对象实现了该接口或继承了该类
